/*!
	\file SymboleValue.h
	\brief La spécification de la classe SymboleValue

	Décrit la liste des méthodes et attributs associés à la class SymboleValue
	\author Arnaud MAILLET
	\date 03.01.2009
*/

/*! 
	\class SymboleValue
	\brief La classe permettant de construire les symboles valués

	Cette classe permet de construire les symboles valués.
	Elle dérive de symbole, un symbole valué est un symbole qui a une valeur, définie ou pas.
	Elle dérive de noeud, car c'est aussi une feuille de l'arbre abstrait
	Les méthodes suivantes sont associées à un objet de type SymboleValue :
	\li afficher
	\li getValeur
	\li setValeur
	\li estDefini
	\li <<
	\li afficherPhp
	\li getValeurCase
*/
#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <iostream>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"

class SymboleValue : public Symbole, public Noeud  {
public:
	/*! 
	\fn SymboleValue(int ligne, int colonne, Symbole s)
	\brief Constructeur de la classe SymboleValue.

	Ce constructeur construit un symbole valué à partir d'un symbole existant s.
	\param ligne - la ligne du symbole valué
	\param colonne - la colonne du symbole valué
	\param s - symbole qui devient un symbole valué
        */
	SymboleValue(int ligne, int colonne, Symbole s); 

	/*!
	\fn ~SymboleValue()
	\brief Destructeur de la classe SymboleValue

	Ce destructeur permet de détruire un objet SymboleValue.
	*/
	~SymboleValue() {}

	/*!
	\fn void  afficher (unsigned short indentation=0)
	\brief Permet d'afficher le symbole en tant que noeud de l'arbre
	\param indentation - donne le nombre d'indentation à afficher
	*/
	void afficher (unsigned short indentation=0);

	/*! 
	\fn inline int getValeur()
	\brief Retourne la valeur du symbole
	\return la valeur du symbole
	*/
	inline int getValeur() { return valeur; }

	/*! 
	\fn inline void setValeur(int valeur) 
	\brief Permet d'attribuer une valeur au symbole
	\param valeur - la valeur à attribuer au symbole
	*/
	inline void setValeur(int valeur) { this->valeur=valeur; defini=true; }

	/*! 
	\fn inline bool estDefini()
	\brief Indique si le symbole est défini
	\return vrai si le symbole est défini
	*/
	inline bool estDefini() { return defini; }

	/*! 
	\fn friend ostream & operator <<(ostream & cout, Symbole symb)
	\brief Fonction amie pour pouvoir afficher un symbole valué sur cout
	\param cout - le cout qu'on va utiliser pour afficher le symbole valué
	\param symb - symbole valué à afficher sur cout
	\return la valeur de la chaine du symbole valué sur cout
	*/
	friend ostream & operator << (ostream & cout, SymboleValue symb);

	/*!
	\fn void afficherPhp()
	\brief Permet d'afficher le symbole valué façon Php
	*/
	void afficherPhp();

	/*! 
	\fn int getValeurCase(int val)
	\brief Permet de recuperer la valeur du symbole valué tout en donnant un paramètre
	\param val - valeur à donner en parametre, utile pour l'instruction 'choisir'
	\return la valeur du symbole
	*/
	int getValeurCase(int val) { return val; }
private:

	/*!
	\var bool defini
	\brief Indique si la valeur du symbole est définie
	*/
	bool defini;

	/*!
	\var int valeur
	\brief Contient la valeur du symbole si elle est définie, zéro sinon
	*/
	int valeur;

};

#endif /* SYMBOLEVALUE_H */
